import axios, {
  AxiosError,
  AxiosResponse,
  InternalAxiosRequestConfig,
} from 'axios';

// 定义请求超时时间常量
export const TIMEOUT = {
  DEFAULT: 5 * 1000, // 默认超时时间
  LONG: 10 * 1000, // 长超时时间
  SHORT: 3 * 1000, // 短超时时间
};

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 设置请求的基础URL
  timeout: TIMEOUT.DEFAULT, // 设置请求超时时间
});

/**
 * 请求拦截器：对请求进行预处理
 * @param config 请求配置对象
 * @returns 返回经过处理的请求配置对象
 */
function requestHandler(
  config: InternalAxiosRequestConfig,
): InternalAxiosRequestConfig {
  return config;
}

/**
 * 请求错误处理拦截器：对请求错误进行处理
 * @param error 请求错误对象
 * @returns 返回一个拒绝的Promise，携带错误对象
 */
function requestErrorHandler(error: AxiosError): Promise<AxiosError> {
  return Promise.reject(error);
}

/**
 * 响应拦截器：对响应进行预处理
 * @param response 响应对象
 * @returns 返回一个解析后的响应数据的Promise
 */
function responseHandler<T>(response: AxiosResponse<T>): Promise<T> {
  return Promise.resolve(response.data);
}

/**
 * 响应错误处理拦截器：对响应错误进行处理
 * @param error 响应错误对象
 * @returns 返回一个拒绝的Promise，携带错误对象
 */
function responeErrorHandler(error: AxiosError): Promise<AxiosError> {
  return Promise.reject(error);
}

// 注册请求拦截器
service.interceptors.request.use(requestHandler, requestErrorHandler);

// 注册响应拦截器
service.interceptors.response.use(responseHandler, responeErrorHandler);

export default service; // 导出axios实例
